
#include <chrono>
#include <iostream>

int main()
{
using namespace std;
    /*
duration 一段时间间隔 使用周期和周期个数来表示
// 定义于头文件 <chrono>
template<
    class Rep,
    class Period = std::ratio<1>
> class duration;
*/
    std::chrono::hours h(1);                          // 一小时
    // typedef std::chrono::duration<int64_t, std::ratio<60L>> std::chrono::minutes
    chrono::minutes m(2);    // 2 minutes   
    chrono::seconds s(1);    // 1 seconds
    chrono::milliseconds ms{ 3 };                // 3 毫秒
    //typedef std::chrono::duration<int64_t, std::micro> std::chrono::milliseconds
    chrono::microseconds micro(1);   // 1micro seconds
    chrono::nanoseconds ns{ 1 };   //  1 nanoseconds


/*
// std::ratio 周期 本质是 使用分子和分母来表示周期
// 定义于头文件 <ratio>
template<
    std::intmax_t Num,        //分子
    std::intmax_t Denom = 1   //分母
> class ratio;
*/
    //typedef std::ratio<1L, 1000000L> std::micro
    std::micro dddd;

    chrono::duration<int, ratio<1000>> ks(3);    // 3000 秒

    //chrono::duration<int, ratio<1000>> d3(3.5);  // error
    chrono::duration<double> dd(6.6);               // 6.6 秒

    // 使用小数表示时钟周期的次数
    chrono::duration<double, std::ratio<1, 30>> hz(3.5);  //时钟周期为1/30秒，共有3.5个时钟周期，所以hz表示的时间间隔为1/30*3.5秒

    std::chrono::microseconds us = 2*ms;     // 6000 微秒

    //时钟周期 * 周期次数 = 总的时间间隔:
    std::cout <<  "3 ms duration has " << ms.count() << " ticks\n"
              <<  "6000 us duration has " << us.count() << " ticks\n"
              <<  "3.5 hz duration has " << hz.count() << " ticks\n";

    //计算两个时间间隔的差值:
    chrono::minutes t1(10);
    chrono::seconds t2(60);
    chrono::seconds t3 = t1 - t2;
    cout << t3.count() << " second" << endl;

    /*注意事项：duration的加减运算有一定的规则，当两个duration时钟周期不相同的时候，会先统一成一种时钟，然后再进行算术运算，统一的规则如下：
    假设有ratio<x1,y1> 和 ratio<x2,y2>两个时钟周期，首先需要求出x1，x2的最大公约数X，然后求出y1，y2的最小公倍数Y，统一之后的时钟周期ratio为ratio<X,Y>。*/
    chrono::duration<double, ratio<9, 7>> d1(3);
    chrono::duration<double, ratio<6, 5>> d2(1);
    // d1 和 d2 统一之后的时钟周期
    chrono::duration<double, ratio<3, 35>> d3 = d1 - d2;
}

// 作者: 苏丙榅
// 链接: https://subingwen.cn/cpp/chrono/
// 来源: 爱编程的大丙
// 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。